package algorithm.queen8;

/**
 * @ClassName : data_structure.queen8.Queen8Test
 * @Description : 类描述
 * Created by cyd on 2021-02-13 22:16:09
 */
public class Queen8Test {
    private int max = 8;
    private int[] arr = new int[max];
    private static int count = 0;

    public static void main(String[] args) {

        Queen8Test queen8Test = new Queen8Test();
        queen8Test.doPut(0);
        System.out.println(count);
    }

    /**
     * @Author: cyd
     * @Description: 执行放入的动作
     * @DateTime: 2021/2/13
     * @Params: n：放置的第几个皇后
     * @Return
     */
    private void doPut(int n) {
        // 满足条件，就打印，并回到上一层
        if (n == max) {
            print();
            return;
        }

        for (int i = 0; i < max; i++) {
            // 依次放入皇后
            arr[n] = i;
            // 看看是否冲突
            if (judge(n)) {
                // 如果不冲突，接着放
                doPut(n + 1);
            }
            // 如果冲突，循环继续，数组arr[n]继续变化
        }
    }

    /**
     * @Author: cyd
     * @Description: 判断当前放置的第n个皇后是否满足要求
     * @DateTime: 2021/2/13
     * @Params: n：第几个皇后 arr[n]第n个皇后的位置
     * @Return true：满足    false：不满足
     */
    private boolean judge(int n) {
        for (int i = 0; i < n; i++) {
            // arr[i] == arr[n] ：判断是否在同一列
            // Math.abs(n - i) == Math.abs(arr[n] - arr[i]) ： 判断是否在同一斜线
            if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
                return false;
            }
        }
        return true;
    }

    // 打印结果的方法
    private void print() {
        count++;
        for (int i = 0; i < max; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}
